import re
import random
import string
from django.db import models
from django.core.exceptions import ValidationError

# Create your models here.
# 自定义用户密码。验证由 大于等于6位而且小于等于12位的字符组成，不能包含特殊字符（@符号除外）
def validate_password(value):
    # 检查长度是否在6到12位之间
    if len(value) < 6 or len(value) > 12:
        raise ValidationError("密码长度必须在6到12个字符之间")

        # 使用正则表达式检查是否只包含字母、数字或@符号
    if not re.match(r"^[A-Za-z0-9@]*$", value):
        raise ValidationError("密码只能由包含字母、数字或@")

def validate_username(value):
    # 检查长度是否在3到12位之间
    if len(value) < 3 or len(value) > 12:
        raise ValidationError("用户名长度必须在3到12个字符之间")

        # 用户名只能由字母加一个@符号组成
    if not re.match(r"^[A-Za-z0-9@]*$", value):
        raise ValidationError("用户名只能由字母、数字或@组成")

def validate_email(value):
    # 检查是否包含@符号
    if "@" not in value:
        raise ValidationError("邮箱地址必须包含@符号")
    # 检查是否包含.符号
    if "." not in value:
        raise ValidationError("邮箱地址必须包含.符号")
    if not re.match(r"", value):
        raise ValidationError("邮箱地址格式不正确")
    # 邮箱只能包含 qq 、163
    domains = ['163.com', 'qq.com']
    domain = value.split('@')[1]
    if domain not in domains:
        raise ValidationError(f"支持的邮箱地址：{domains}")
    return True


"""
Django 数据库迁移命令: 
python manage.py makemigrations
python manage.py migrate
"""


def generate_random_user_number():
    """
    生成随机的用户编号
    这里示例生成一个由数字和字母组成的长度为10的随机字符串作为用户编号，你可以根据实际需求调整规则
    """
    length = 10
    all_characters = string.ascii_letters + string.digits
    random_number = ''.join(random.choice(all_characters) for _ in range(length))
    return random_number
class Users(models.Model):
    name = models.CharField(verbose_name='用户名', max_length=10)
    phone = models.CharField(verbose_name='手机号', max_length=11, unique=True)
    password = models.CharField(verbose_name='密码', max_length=12, validators=[validate_password])
    user_avatar_img = models.FileField(verbose_name='用户头像', null=True, blank=True, default="default/UserImage.jpg")
    user_number = models.CharField(verbose_name='用户编号', null=True, blank=True, max_length=50, unique=True)
    # 贷款默认额度
    loan_default_amount = models.IntegerField(verbose_name='额度', null=True, blank=True, default=0)
    # 用户是否已经认证过
    user_is_authenticated_choices = [
        (0, '未认证'),
        (1, '已认证'),
        (2, '已拒绝'),
    ]
    user_is_authenticated = models.IntegerField(verbose_name='实名认证状态', null=True, blank=True, default=0, choices=user_is_authenticated_choices)
    def save(self, *args, **kwargs):
        """
        重写save方法，在保存用户实例前，如果用户编号为空，则生成随机编号并赋值
        """
        if not self.user_number:
            self.user_number = generate_random_user_number()
        super(Users, self).save(*args, **kwargs)



# 用户实名身份
class RealNameIdentity(models.Model):
    id_card_front_image = models.FileField(verbose_name='身份证正面', upload_to="Users/Card/id_card_front_image/")
    id_card_back_image = models.FileField(verbose_name='身份证正面', upload_to="Users/Card/id_card_back_image/")
    user = models.ForeignKey(verbose_name='身份证用户', to="Users", on_delete=models.CASCADE)
    idCard = models.CharField(verbose_name='身份证号码', max_length=32, default="",  unique=True)
    name = models.CharField(verbose_name='用户名', max_length=10, default="", unique=True)
    # 是否已审核
    is_audit = models.BooleanField(verbose_name='是否已审核', default=False, null=True, blank=True)
    # 提交时间
    create_time = models.DateTimeField(verbose_name='提交时间', auto_now_add=True, null=True, blank=True)


def generate_random_LoanOrder_number():
    """
    生成随机的订单编号
    这里修改为生成一个长度为16的仅由数字组成的随机数作为订单编号，可根据实际需求进一步调整规则
    """
    length = 16
    all_characters = string.digits  # 只使用数字字符
    random_number = ''.join(random.choice(all_characters) for _ in range(length))
    return random_number

# 借款订单
class LoanOrder(models.Model):
    user = models.ForeignKey(verbose_name='用户', to="Users", on_delete=models.CASCADE)
    amount = models.IntegerField(verbose_name='借款金额', default=1)
    status_choices = [
        (0, '待审核'),
        (1, '已通过'),
        (2, '已拒绝'),
        (3, '已放款'),
        (4, '已还款'),
        (5, '已逾期'),
        (6, '已流标'),
    ]
    status = models.SmallIntegerField(verbose_name='订单状态', choices=status_choices, default=0)
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    update_time = models.DateTimeField(verbose_name='更新时间', auto_now=True)
    # 借款订单编号
    loan_order_number = models.CharField(verbose_name='借款订单编号', max_length=50, unique=True,null=True, blank=True)
    # 订单描述
    description = models.TextField(verbose_name='订单描述', null=True, blank=True, default="借款")
    # 放款时间
    loan_time = models.DateTimeField(verbose_name='放款时间', null=True, blank=True)
    # 还款时间
    repayment_time = models.DateTimeField(verbose_name='还款时间', null=True, blank=True)
    # 逾期时间
    overdue_time = models.DateTimeField(verbose_name='逾期时间', null=True, blank=True)
    # 逾期天数
    overdue_days = models.IntegerField(verbose_name='逾期天数', null=True, blank=True)
    # 放款金额
    loan_amount = models.IntegerField(verbose_name='放款金额', null=True, blank=True)
    # 逾期金额
    overdue_amount = models.IntegerField(verbose_name='逾期金额', null=True, blank=True)
    # 放款方式, 比如支付宝
    loan_method_choices = [
        (0, '支付宝'),
        (1, '微信'),
        (2, '银行卡'),
    ]
    loan_method = models.SmallIntegerField(verbose_name='放款方式', choices=loan_method_choices, default=0, null=True, blank=True)

    def __str__(self):
        return f"{self.user.name}的借款订单"
    def save(self, *args, **kwargs):
        """
        重写save方法，在保存用户实例前，如果用户编号为空，则生成随机编号并赋值
        """
        if not self.loan_order_number:
            self.loan_order_number = generate_random_LoanOrder_number()
        super(LoanOrder, self).save(*args, **kwargs)









